Changes from PyU3D 1.0 Beta to PyU3D 1.0 Final

Manual
======

Additions
---------

*) Chapters documenting particle effects and model manipulation.
*) Interactive class hierarchy diagram.
*) Constants added to List Of Functions And Classes.
*) Small arrows at the top right of method descriptions that link to the method listing of the class, to make navigation easier.
*) Indentation of "get"-methods of corresponding "set"-methods in method listings, to increase readability.


Implementation
==============

Fixes
-----

*) The Ultimate3D.dll should now be detected, even if it is not in the Windows path.

*) The user program will now run at the desired framerate (if the hardware allows it).


Changes
-------

*) PyU3D.host.beginStep() and PyU3D.host.endStep() have been replaced with PyU3D.host.step(), which is normally called at the beginning of the main loop.

*) All invalidated objects have a truth value of false; this makes it possible to check the validity of an object in conditional expressions and in if- and while-statements.

*) switchView(...) is replaced with setViewVisibility(...) and getViewVisibility(...).

*) PRIMARY_ROOM is renamed to PrimaryRoom.
*) Camera.screenPosFromWorldPos(...) is renamed to Camera.getScreenPosFromWorldPos(...).
*) Camera.directionFromScreenPos(...) is renamed to Camera.getDirectionFromScreenPos(...).
*) Camera.worldPosFromScreenPos(...) is renamed to Camera.getWorldPosFromScreenPos(...).
*) Camera.portalEngineActive() is renamed to Camera.portalEngineIsActive().
*) The "subdivision" parameter of Box.setTexSubdivision(...) is renamed to "subdiv_tex" and given a default value of True instead of None.

*) The "screen_x" and "screen_y" parameters of Camera.getDirectionFromScreenPos(...) and Camera.getWorldPosFromScreenPos(...) are replaced with the "screen_pos" parameter.

*) The "room" parameter of Camera.getWorldPosFromScreenPos(...) now defaults to PrimaryRoom instead of None.

*) The "width" and "height" parameters of Box() are set to None by default, making it easier to define cubes.

*) ModelBase.setAnimation(...) is renamed to ModelBase.updateAnimation(...), which must be called each step of the program to advance the animation;
a specific frame can be set by giving a single number to the "frame_range" parameter (effectively setting the first and last frame to that same value).

*) The "speed" parameter of Transformable.move(...) and SweptEllipsoid.move(...) can take a Vector object, implicitly giving a direction also.

*) The "axis" parameter of AxisRotationMatrix(...) can take a (latitude, longitude) tuple.

*) The "coll_obj" parameter of SweptEllipsoid.move(...), SweptEllipsoid.getFreePosition(...), SweptEllipsoid.collisionOccurred(...) and Ray.trace(...) is set to All by default.

*) The matrix given for the "offset_matrix" parameter of Transformable.alignTo(...) is now combined with the full target.getTransformation() matrix and the resulting matrix is applied to the calling object, depending on the values of the "position", "orientation" and "scale" parameters.
Previously, the offset matrix was combined with a partial target transformation matrix, also depending on the values of the "position", "orientation" and "scale" parameters.

*) ModelBase.getMaterial(mat_id) now returns None instead of a Material object that the first model material is associated with, if the given material id is invalid.

*) Ray.getIntersectDist() now returns None instead of 100000 if no intersection occurred during the last call to Ray.trace(...).

*) The object intersected first in the last call to Ray.trace(coll_obj=All,...) is now returned instead of All.


Additions
---------

*) PyU3D.Material.getModel().

*) Mouse.getVisibility().
*) Mouse.setCursor(...).

*) PyU3D.host.setFocus(...).
*) PyU3D.host.getFocus().

*) PyU3D.host.updateTime().

*) Additional parameter "fps_update_delay" for PyU3D.host.setSpeedLimit(...).

*) PyU3D.host.setDeltaTimeStepRange(...).
*) PyU3D.host.getDeltaTime().
